package com.say.utils.weixin;


import com.alibaba.fastjson.JSONObject;
import com.say.bean.domain.User;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URLEncoder;



/** 
 * 公众平台通用接口工具类 
 */  
public class AdvancedUtil {  
    

	
	private static Logger log = LoggerFactory.getLogger(AdvancedUtil.class);
	/**
	 *  OAuth2.0引导关注者打开 用户同意授权，获取code页面url
	 *  1.scope的设置为：snsapi_base（不弹出授权页面，直接跳转，只能获取用户openid），snsapi_userinfo （弹出授权页面)
	 *  2.redirect_uri：授权后重定向的回调链接地址，请使用urlencode对链接进行处理  方法再commonutil的urlEncodeUTF8()
	 */
	public final static String FANS_GET_CODE="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
	// OAuth2.0通过code换取网页授权access_token
	protected final static String OAUTH2_ACCESSTOKEN_URL="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
	// OAuth2.0拉取用户信息(需scope为 snsapi_userinfo)
	protected final static String OAUTH2_USERINFO_URL="https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
	//第三方使用网站应用授权登录前请注意已获取相应网页授权作用域
	public final static String QR_CONNECT ="https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";

	public static String getOpenId(String code) {
		WeixinOauth2Token wat = getOauth2AccessToken(code);
		if (wat==null){
			return null;
		}
		else{
			return wat.getOpenId();
		}
	}
	public static String getbaseurl(String url) throws Exception{
		String requestUrl=FANS_GET_CODE.replace("APPID", WeixinUtil.APPID).replace("REDIRECT_URI", URLEncoder.encode(url,"UTF-8")).replace("SCOPE", "snsapi_base");
		return requestUrl;
	}
	public static String getuserinfourl(String url) throws Exception{
		String requestUrl=FANS_GET_CODE.replace("APPID", WeixinUtil.APPID).replace("REDIRECT_URI", URLEncoder.encode(url,"UTF-8")).replace("SCOPE", "snsapi_userinfo");
		return requestUrl;
	}
	/**
	 * 第三方使用网站应用授权登录前请注意已获取相应网页授权作用域
	 */
	public static String getQrconnect(String url) throws Exception{
		String requestUrl=QR_CONNECT.replace("APPID", WeixinUtil.APPID).replace("REDIRECT_URI", URLEncoder.encode(url,"UTF-8")).replace("SCOPE", "snsapi_login");
		return requestUrl;
	}
	/**
	 * 1.通过code换取网页授权access_token
	 * @param appId  公众号的唯一标识
	 * @param appSecret 公众号的appsecret
	 * @param code 填写第一步获取的code参数
	 * @return WeixinOauth2Token
	 */
	public static WeixinOauth2Token getOauth2AccessToken(String code) {
		WeixinOauth2Token wat=null;
		String requestUrl=OAUTH2_ACCESSTOKEN_URL.replace("APPID", WeixinUtil.APPID).replace("SECRET", WeixinUtil.APPSECRET).replace("CODE", code);
		log.error("通过code换取网页授权requestUrl-->"+requestUrl);
		//获取网页授权凭证
		JSONObject jsonObject = WeixinUtil.httpRequest(requestUrl, "GET", null); 
		log.error("通过code换取网页授权，jsonObject={}",jsonObject.toJSONString());
		if (null != jsonObject) {
			//log.info("获取用户信息jsonObject---" +jsonObject.toJSONString());  
			try {
				wat=new WeixinOauth2Token();
				wat.setAccessToken(jsonObject.getString("access_token"));
				wat.setExpiresIn(jsonObject.getIntValue("expires_in"));
				wat.setRefreshToken(jsonObject.getString("refresh_token"));
				wat.setOpenId(jsonObject.getString("openid"));
				wat.setScope(jsonObject.getString("scope"));
				if(jsonObject.containsKey("unionid")){
					wat.setUnionId(jsonObject.getString("unionid"));
				}
			//	log.info("获取用户信息errmsg---" +jsonObject.getString("errcode"));  
			//	log.info("获取用户信息errmsg---" +jsonObject.getString("errmsg"));  
			//	log.info("获取用户信息scope---" +jsonObject.getString("scope"));  
			} catch (Exception e) {
				int errorCode=jsonObject.getIntValue("errcode");
				String errorMsg=jsonObject.getString("errmsg");
				log.error("获取网页授权凭证失败errcode:{"+errorCode+"} errmsg:{"+errorMsg+"}");
				return null;
			}
		}
		return wat;
	}
	public static User getUserInfo(String accessToken, String openId) {
		User user = null;    
		// 拼接请求地址    
		String requestUrl = OAUTH2_USERINFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);    
		// 获取用户信息    
		JSONObject jsonObject = WeixinUtil.httpRequest(requestUrl, "GET", null);    
		if (null != jsonObject) {      
			try {        
				user = new User();        
				// 用户的标识       
				user.setOpenId(jsonObject.getString("openid"));        
				// 昵称        
				user.setWxName(jsonObject.getString("nickname"));        
				// 用户的性别（1是男性，2是女性，0是未知）        
				user.setSex(jsonObject.getIntValue("sex"));        
				// 用户所在国家       
				user.setCountry(jsonObject.getString("country"));        
				// 用户所在省份        
				user.setProvince(jsonObject.getString("province"));        
				// 用户所在城市       
				user.setCity(jsonObject.getString("city"));        
				// 用户头像        
				user.setWeixinPhoto(jsonObject.getString("headimgurl"));  
				
				// 用户的语言，简体中文为zh_CN        
				user.setLanguage(jsonObject.getString("language"));     
				
				user.setSubscribe(0);//默认是未关注，
				String unionid =jsonObject.getString("unionid");
				if(unionid!=null){
					user.setUnionid(unionid);
				}
				} catch (Exception e) {        
							int errorCode = jsonObject.getIntValue("errcode");          
							String errorMsg = jsonObject.getString("errmsg");          
							log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);        
					}      
			}    
				return user;
	}
}  
